/**
 * 登录用户状态管理
 */
import { defineStore } from 'pinia';
import { HOME_PATH } from '@/config/setting';
import { toTree, mapTree, isExternalLink } from 'ele-admin-plus/es';
import type { MenuItem } from 'ele-admin-plus/es/ele-pro-layout/types';
import { getUserInfo } from '@/api/auth';
import { EleMessage } from 'ele-admin-plus/es';
import { logout } from '@/utils/common';
import type { SysMenu } from "@/api/system/SysMenu/model"
import type { UserInfo } from '@/api/auth/model';
/** 直接指定菜单数据 */
const USER_MENUS: SysMenu[] | null = null;

export interface UserState {
  info: UserInfo | null;
  menus: MenuItem[] | null;
  authorities: (string | undefined)[];
  roles: (string | undefined)[];
}

export const useUserStore = defineStore('user', {
  state: (): UserState => ({
    /** 当前登录用户的信息 */
    info: null,
    /** 当前登录用户的菜单 */
    menus: null,
    /** 当前登录用户的权限 */
    authorities: [],
    /** 当前登录用户的角色 */
    roles: [],
    /** 字典数据缓存 */
  }),
  actions: {
    /**
     * 请求登录用户的个人信息/权限/角色/菜单
     */
    async fetchUserInfo() {
      const res = await getUserInfo()
      if (!res) {
        return {};
      }
      // 用户信息
      this.setInfo(res.data!);
      // 检测用户信息中携带菜单是否正常
      if (!res.data!.sysMenuList || res.data?.sysMenuList.length === 0) {
        EleMessage.error('获取用户菜单失败');
        logout(false);
        return {};
      }
      // 用户角色
      this.roles = res.data?.roleList?.map?.((d) => d.roleCode) ?? [];
      // 用户菜单, 过滤掉按钮类型并转为children形式
      const { menus, homePath } = formatMenus(
        USER_MENUS ??
        toTree({
          data: res.data!.sysMenuList.sort((a, b) => a.sort - b.sort) ,
          idField: 'id',
          parentIdField: 'parentId'
        })
      );
      this.setMenus(menus);
      return { menus, homePath };
    },
    /**
     * 更新用户信息
     */
    setInfo(value: UserInfo) {
      this.info = value;
    },
    /**
     * 更新菜单数据
     */
    setMenus(menus: MenuItem[] | null) {
      this.menus = menus;
    },
    /**
     * 更新菜单的徽章
     * @param path 菜单地址
     * @param value 徽章值
     * @param type 徽章类型
     */
    // setMenuBadge(
    //   path: string,
    //   value?: number | string | null,
    //   type?: BadgeProps['type']
    // ) {
    //   this.menus = mapTree(this.menus, (m) => {
    //     if (path === m.path) {
    //       const meta = m.meta || {};
    //       return {
    //         ...m,
    //         meta: {
    //           ...meta,
    //           props: {
    //             ...meta.props,
    //             badge: value == null ? void 0 : { value, type }
    //           }
    //         }
    //       };
    //     }
    //     return m;
    //   });
    // },
    /**
     * 更新字典数据
     */
  }
});

/**
 * 菜单数据处理为EleProLayout所需要的格式
 * @param data 菜单数据
 * @param childField 子级的字段名称
 */
function formatMenus(data: SysMenu[], childField = 'children') {
  let homePath: string | undefined;
  let homeTitle: string | undefined;
  const menus = mapTree<SysMenu, MenuItem>(
    data,
    (item) => {
      const meta: MenuItem['meta'] =
        typeof item.meta === 'string'
          ? JSON.parse(item.meta || '{}')
          : item.meta;
      const menu: MenuItem = {
        path: item.path!,
        component: item.componentPath,
        meta: { title: item.name, icon: item.icon, hide: item.hide == '0' ? false : true, ...meta }
      };
      const children = item[childField]?.filter?.(
        (d: any) => d.hide == '0'
      );
      if (!children?.length) {
        if (
          menu.path &&
          (!homePath || HOME_PATH === menu.path) &&
          !isExternalLink(menu.path)
        ) {
          homePath = menu.path;
          homeTitle = menu.meta?.title;
        }
      } else {
        const childPath = children[0].path;
        if (childPath) {
          if (!menu.redirect) {
            menu.redirect = childPath;
          }
          if (!menu.path) {
            menu.path = childPath.substring(0, childPath.lastIndexOf('/'));
          }
        }
      }
      if (!menu.path) {
        return;
      }
      return menu;
    },
    childField
  );
  return { menus, homePath, homeTitle };
}
